Шаг 22 - Тире, точка, тире

Загрузить проект

Посмотрим как нарисовать азбуку морзе. Для этого создадим обычный проект и сделаем необходимые дополнения для OpenGL, как в предыдущих примерах.

Для того, чтобы сконцентрироваться на работе шаблонов создадим функцию, которая будет рисовать линию. Назовем ее скажем DrawLine(...):

void CExampleView::DrawLine(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
{
	CRect rect;

	GetClientRect(&rect);
	glBegin(GL_LINES);
		glVertex2f(2*x1/rect.right - 1.0f, y1/rect.bottom - 0.5f);
		glVertex2f(2*x2/rect.right - 1.0f, y2/rect.bottom - 0.5f);
	glEnd();
}

Теперь изменим функцию OnDraw(...):

void CExampleView::OnDraw(CDC* pDC)
{
	CRect clientRect;

	CExampleDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	// TODO: add draw code for native data here
	GetClientRect(&clientRect);
	glViewport(0, 0, clientRect.right, clientRect.bottom);

	glClearColor (0.5, 0.5, 0.75, 1.0);	// цвет фона
	glClear (GL_COLOR_BUFFER_BIT);	// очистка буфера цвета

	glColor3f (1.0, 0.0, 0.5);		// текущий цвет примитивов

	glEnable(GL_LINE_STIPPLE);

	glLineWidth (5);			// === толщина 5

	glLineStipple(1, 0x0101);		// точечный
	DrawLine(50.0, 125.0, 150.0, 125.0);

	glLineStipple(1, 0x00F0);		// штриховой
	DrawLine(150.0, 125.0, 250.0, 125.0);

	glLineStipple(1, 0x1C47);		// штрихпунктир
	DrawLine(250.0, 125.0, 350.0, 125.0);

	glLineWidth (20);			// === толщина 20

	glLineStipple(1, 0x0101);
	DrawLine(50.0, 50.0, 150.0, 50.0);

	glLineStipple(1, 0x00F0);
	DrawLine(150.0, 50.0, 250.0, 50.0);

	glLineStipple(1, 0x1C47);		// тире, точка, тире
	DrawLine(250.0, 50.0, 350.0, 50.0);

	glLineWidth (5);

	glLineStipple(5, 0x1C47);
	DrawLine(50.0, 10.0, 150.0, 10.0);
}

Обратите внимание на пару команд glEnable(GL_LINE_STIPPLE) и glLineStipple(1, 0x0101). Первая из них включает пунктирный режим, а вторая задает вид пунктира. Естественно пунктир задается в виде битовой маски. Вот и все.

Шпаргалка

  1. Создать проект.
  2. Включить пунктирный режим и установить нужный пунктир.
  3. Рисовать.

Как и большинство команд OpenGL, команда включения пунктира имеет и команду выключения, т.е. glDisable(GL_LINE_STIPPLE). А установленный вид пунктира действует на все линии, которые лежат ниже команды установки. Чтобы отключить пунктир надо либо сделать прозрачную маску, либо отключить режим вообще.

Автор Kirill V. Ratkin.
Hosted by uCoz